/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraExpAritmetica extends Regra{

    protected static Regra instancia;


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraExpAritmetica() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraExpAritmetica getInstance() {
        if (instancia == null) {
            instancia = new RegraExpAritmetica();
        }
        return (RegraExpAritmetica) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        NoArvore terminalExpAritm = new NoArvore("<exp_aritmetica>", false);

       
        if (RegraMultiplicacao.getInstance().getPrimeiro().contains(listaTokens.getFirst().getLexema())) {

            terminalExpAritm.adicionaFilho(RegraMultiplicacao.getInstance().analisar(listaTokens));

            while (RegraOpAdicao.getInstance().getPrimeiro().contains(listaTokens.getFirst().getLexema())) {

                terminalExpAritm.adicionaFilho(RegraOpAdicao.getInstance().analisar(listaTokens));

                terminalExpAritm.adicionaFilho(RegraMultiplicacao.getInstance().analisar(listaTokens));

            }
        }
        return terminalExpAritm;
    }


    @Override
    protected void setPrimeiro() {
        //P<exp_aritmetica>= P<cast>
        primeiro.add("(");
        primeiro.add("{");
        primeiro.add("identificador");
        primeiro.add("numeroInteiro");
        primeiro.add("numeroFlutuante");
        primeiro.add("charconst");
        primeiro.add("++");
        primeiro.add("--");
        primeiro.add("&");
        primeiro.add("*");
    }

    @Override
    protected void setSeguinte() {
        /* S<exp_aritmetica>=  P<op_relacional> U S<relacional>
            -> S<exp_aritmetica>= {"<" , "<=" , ">" , ">="} U {"==" , "!=" } U
         {&&} U {'{'} U {identificador, "(", numeroInteiro , numeroFlutuante ,
         charconst, '++', '--', '&', '*'}U {";", ",", "}" ")"}*/
        seguinte.addAll(primeiro);
        seguinte.add("<");
        seguinte.add("<=");
        seguinte.add(">");
        seguinte.add(">=");
        seguinte.add("==");
        seguinte.add("!=");
        seguinte.add("&&");
        seguinte.add(";");
        seguinte.add(",");
        seguinte.add("}");
        seguinte.add(")");

    }

   

}
